Добрый день, Артём. Посылаю Вам исправленный 241й шаг (2я часть статьи про автоматизацию оффиса), а также 3ю часть статьи (наверное, заключительную, написанную "по просьбам телезрителей") и исходники, иллюстрирующие всё в статье изложенное. С уважанием, Чернопятов Е.А. http://ercombinati.narod.ru/articles
Продолжение описания начатого в Шаг 240 - АВТОМАТИЗАЦИЯ приложений MS Office.
Мы научились выводить текст на страницу. Это неплохо, но для полного счастья не хватает, чтобы этот текст был форматированным. Этим мы сейчас и займемся. Определим константы, необходимые для задания типов выравнивания, и вставки разрыва (соответственно, разрыва страницы и секции).
typedef enum { wdAlignParagraphLeft = 0, wdAlignParagraphCenter = 1, wdAlignParagraphRight = 2, wdAlignParagraphJustify = 3, wdAlignParagraphDistribute = 4, wdAlignParagraphJustifyMed = 5, wdAlignParagraphJustifyHi = 7, wdAlignParagraphJustifyLow = 8 } WdParagraphAlignment;
Для изменения выравнивания текста у текущего выделения есть метод void SetAlignment(long nNewValue), в качестве параметра которому передается требуемое выравнивание.
Обратите внимание, что при задании строчек вывода мы по-прежнему можем пользоваться символами табуляции и перевода строки.
В продолжение предыдущего шага пишем:
oPar.SetAlignment(wdAlignParagraphCenter); oSel.TypeText("Этот текст будет выровнен по центру\n"); oPar.SetAlignment(wdAlignParagraphRight ); oSel.TypeText("Этот текст будет выровнен по правому краю\n"); oPar.SetAlignment(wdAlignParagraphLeft ); oSel.TypeText("Этот текст будет выровнен по левому краю\n"); oPar.SetAlignment(wdAlignParagraphJustify ); oSel.TypeText("Этот текст будет выровнен по обоим краям\n");
Теперь поменяем начертание шрифта. Для этого можно использовать методы
BoldRun() и ItalicRun(), принадлежащие Selection :
oSel.BoldRun(); oSel.TypeText("Этот текст будет жирным\n"); oSel.ItalicRun(); oSel.TypeText("Этот текст будет наклонным\n");
Для того, чтобы отключить изменение начертания, достаточно просто вызвать
соответствующий метод еще раз (совсем как когда мы нажимаем/отжимаем кнопки и
).
Вставим в документ разрыв страницы. Это будет немного сложнее, поскольку метод InsertBreak требует в качестве параметра переменную типа COleVariant. Но мы можем воспользоваться простым конструктором с параметром для преобразования наших констант в требуемый тип:
typedef enum { wdSectionBreakNextPage = 2, wdSectionBreakContinuous = 3, wdSectionBreakEvenPage = 4, wdSectionBreakOddPage = 5, wdLineBreak = 6, wdPageBreak = 7, wdColumnBreak = 8, wdLineBreakClearLeft = 9, wdLineBreakClearRight = 10, wdTextWrappingBreak = 11 } WdBreakType; COleVariant сovBreakType((long)wdPageBreak); // вставить разрыв страницы oSel.InsertBreak(covBreakType);
На самом деле, более предпочтительным методом изменения начертания текста является непосредственное обращение к шрифту текущего выделения. К тому же, в этом случае кроме начертания мы можем менять и прочие параметры шрифта, такие, как семейство, размер и проч.
_Font fnt; // получить параметры шрифта выделения fnt=oSel.GetFont(); // сделать шрифт полужирным fnt.SetBold(1); // изменить имя шрифта fnt.SetName("Arial"); // изменить размер шрифта fnt.SetSize(24); oSel.TypeText("Этот текст будет полужирным семейства Arial, размером 24.");
Отмечу, что для снятия атрибутов шрифта достаточно вызвать соответствующий метод с параметром 0, например:
// снять атрибут полужирности fnt.SetBold(0);
В настоящее время редкий документ обходится без картинок. Не будем и мы лишать себя удовольствия немного разнообразить скучный текст.
Для начала добавим две переменных типа COleVariant с начальными значениями TRUE и FALSE.
COleVariant covTrue((short)TRUE), covFalse((short)FALSE);
Теперь точно также, как раньше, добавляем 2 класса, которые отвечают за "внедренные фигуры". Первый класс, как обычно, коллекция, второй - одиночная фигура.
InlineShapes oShps; InlineShape oShp;
Получаем текущюю коллекцию, и добавляем в нее новую фигуру. Для этого используем метод LPDISPATCH AddPicture(LPCTSTR FileName, VARIANT* LinkToFile, VARIANT* SaveWithDocument, VARIANT* Range);. Обратите внимание на параметры. Первый - это местоположение вставляемой картинки на диске, второй - вставлять картинку в текст как она есть на момент вставки или установить связь с картинкой таким образом, чтобы при изменении изображения оно обновлялось и в документе. Третий параметр - сохранять ли картинку внутри документа. Последний параметр мы игнорируем. Эти параметры похожи на те, которые мы настраиваем в Word-e:
//добавим параграф oSel.TypeParagraph(); oShps = oSel.GetInlineShapes(); oShp = oShps.AddPicture("d:\\winnt\\Rhododendron.bmp",covFalse,covTrue,covOptional);
Естественно, на Вашей машине путь к картинке будет другим :)
Мы можем изменять параметры нашей картинки, например, ее ширину и высоту. Например, увеличим размер вставленной картинки в 1.5 раза.
float width = oShp.GetWidth(); float height = oShp.GetHeight(); oShp.SetWidth(width*1.5); oShp.SetHeight(height*1.5);
Если попытаться закрыть наш красивый документ, то выяснится, что имя-то мы ему не задали, и автоматически не сохранили. Пользователю приходится самому придумывать, куда записывать и какое имя давать отчету. Давайте избавим пользователя от лишних вопросов. Для этого у нас есть функция... правильно, void SaveAs(VARIANT* FileName, VARIANT* FileFormat, VARIANT* LockComments, VARIANT* Password, VARIANT* AddToRecentFiles, VARIANT* WritePassword, VARIANT* ReadOnlyRecommended, VARIANT* EmbedTrueTypeFonts, VARIANT* SaveNativePictureFormat, VARIANT* SaveFormsData, VARIANT* SaveAsAOCELetter);, опять-таки со множеством параметров. Можно настроить все, что угодно, включая пароль.
_Document oActiveDoc; oActiveDoc = app.GetActiveDocument(); oActiveDoc.SaveAs(COleVariant("c:\\doc1.doc"), COleVariant((short)0), covFalse, COleVariant(""), covTrue, COleVariant(""), covFalse, covFalse, covFalse, covFalse, covFalse);